package com.lifang.framework.beans.factory.config;

import com.lifang.framework.beans.factory.support.BeanDefinition;
import com.lifang.framework.beans.BeansException;
import com.lifang.framework.beans.factory.PropertyValues;

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

    /**
     * 在实例化目前之前执行的BeanPostProcessor，返回的对象可能是代理对象，而不是目标Bean，从而抑制目标Bean的默认实例化
     */
    default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        return null;
    }

    /**
     * 在bean被实例化之后，是否继续执行后续的赋值初始化等操作
     */
    default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        return true;
    }

    /**
     * 实例化完成后,提供修改PropertyValues属性的机会
     */
    default PropertyValues postProcessProperties(PropertyValues propertyValues, Object bean, String beanName) throws BeansException {
        return null;
    }

    /**
     * 获取包装后的代理对象
     */
    default Object getEarlyBeanReference(Object bean, BeanDefinition definition, String beanName) {
        return bean;
    }
}
